package main

import "fmt"

func updateSlice(s []int) {
	s[0] = 100
}

func main() {
	arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
	slice := arr[2:6]
	fmt.Println("arr[2:6]=", arr[2:6])
	slice[1] = 9
	fmt.Println("slice", slice)
	fmt.Println("arr", arr)
	fmt.Println("arr[:6]=", arr[:6])
	s1 := arr[2:]
	fmt.Println("s1 = arr[2:]=", s1)
	s2 := arr[:]
	fmt.Println("s2 = arr[:]=", s2)

	fmt.Println("After updateSlice(s1)")
	updateSlice(s1)
	fmt.Println(s1)
	fmt.Println(arr)

	fmt.Println("After updateSlice(s2)")
	updateSlice(s2)
	fmt.Println(s2)
	fmt.Println(arr)

	fmt.Println("===========Reslice==============")
	fmt.Println(s2)
	s2 = s2[:5]
	fmt.Println(s2)
	s2 = s2[2:]
	fmt.Println(s2)

	fmt.Println("Extending Slice=====")
	arr[0], arr[2] = 0, 2
	s1 = arr[2:6]
	s2 = s1[3:5]
	fmt.Println("arr=", arr)
	fmt.Println("s1=arr[2:6]=", s1)
	fmt.Println("s2=s1[3:5]=", s2)
	//fmt.Println(s1[4])
	fmt.Println(len(s2), cap(s2))
	/*
		slice可以向后扩展, 不可以向前扩展
		s[i]不可以超越len(s), 向后扩展不可以超越底层数组cap(s)
	*/
	s3 := append(s2, 10)
	s4 := append(s3, 11)
	s5 := append(s4, 12)
	fmt.Println(len(s2), cap(s2))
	fmt.Println(len(s3), cap(s3))
	fmt.Println("s3, s4, s5 =", s3, s4, s5)
	fmt.Println(arr)
	s4[1] = 87
	fmt.Println(s4)
	fmt.Println("s3, s4, s5 =", s3, s4, s5)
	fmt.Println("s2[0:3]=", s2[0:3])
	/*
		todo: 向slice添加元素
		- 添加元素时如果超越cap, 系统会重新分配更大的底层数组
		- 由于值传递的关系, 必须接收append的返回值: s = append(s, val)
	*/
}

/*
todo: slice
Slice本身没有数据, 是对底层array的一个view
*/
